package main

import (
	"fmt"
	"math"
	"reflect"
	"runtime"
)

func evalNew(a, b int, op string) (int, error) {
	switch op {
	case "+":
		return a + b, nil
	case "-":
		return a - b, nil
	case "*":
		return a * b, nil
	case "/":
		q, _ := div(a, b) // 下划线 _ 表明了这个返回值不用
		return q, nil
	default:
		return 0, fmt.Errorf("unsupported operation: %s", op)
	}
}

// 13 / 3 = 4 ... 1
// 函数多返回值
func div(a, b int) (q, r int) {
	//return a / b, a % b
	q = a / b
	r = a % b
	return
}

// 嵌套函数
func apply(op func(int, int) int, a, b int) int {
	// reflect.ValueOf(op)反射获得函数真正的值，Pointer()获得函数的指针
	p := reflect.ValueOf(op).Pointer()
	opName := runtime.FuncForPC(p).Name() // 获得函数名
	fmt.Printf("Calling function %s with args "+"(%d, %d)\n", opName, a, b)
	return op(a, b)
}

func pow(x, y int) int {
	return int(math.Pow(float64(x), float64((y))))
}

// 可变参数列表
func sum(numbers ...int) int {
	s := 0
	for i := range numbers {
		s += numbers[i]
	}
	return s
}

func main() {
	if result, err := evalNew(3, 4, "X"); err != nil {
		fmt.Println("Error:", err)
	} else {
		fmt.Println(result)
	}
	q, r := div(13, 3)
	fmt.Println(q, r)
	fmt.Println(apply(pow, 3, 4))
	fmt.Println(apply(
		// 匿名函数 Calling function main.main.func1 with args (3, 4)
		// main 包名， main 主函数的main， func1 匿名函数的系统命名
		func(i int, i2 int) int {
			return int(math.Pow(float64(i), float64(i2)))
		}, 3, 4))
	fmt.Println(sum(1, 2, 3, 4, 5))
}
